# boot.s - RISC-V启动代码
.section .text.startup  # 与链接脚本中的启动段匹配
.globl _start

_start:
    # 1. 初始化栈指针（16字节对齐，符合RISC-V ABI要求）
    li sp, 0x80200000  # 栈地址应在可用内存范围内，且远离内核代码区
    and sp, sp, ~0xF   # 确保栈指针16字节对齐

    # 2. 清零BSS段（未初始化的全局/静态变量）
    la t0, __bss_start  # 获取BSS段起始地址
    la t1, __bss_end    # 获取BSS段结束地址
bss_clear_loop:
    bge t0, t1, bss_clear_done  # 若已到达BSS段末尾，退出循环
    sw zero, 0(t0)              # 清零当前地址（32位字操作）
    addi t0, t0, 4              # 移动到下一个字
    j bss_clear_loop
bss_clear_done:

    # 3. 调用main函数
    call main

    # 4. main返回后进入无限循环（防止程序退出）
loop:
    j loop

# 5. UART字符输出函数（供C代码调用）
# 参数：a0 = 要输出的字符（ASCII码）
.globl uart_putc
uart_putc:
    li t0, 0x10000000  # UART基地址（QEMU virt平台的UART0地址）
    sb a0, 0(t0)       # 将字符写入UART数据寄存器
    ret

